%code {

}
%define package "es.uca.plii.warrenl0"
%define parser_class_name "WarrenExpParser"
%define public
%language "Java"
%token VARIABLE FUNCTOR PUNTOYCOMA QUERYPROMPT PARIZQ PARDCH COMA PUNTO
%type <String> FUNCTOR
%type <String> VARIABLE
%type <Nodo> expresion program termino query estructura constante fot


%start expresion

%%
    expresion
        : program query 
            {Expresion exp = Expresion.getInstance();
             exp.setPrograma($1);
             exp.setQuery($2);}
        ;

    program
        :  termino {NodoVariable.limpiaListaVariables();} PUNTOYCOMA 
        ;

    query
        : QUERYPROMPT termino PUNTOYCOMA {$$=$2;}
        ;

    termino
        :  estructura 
        |  constante 

    constante
        : FUNCTOR {$$=new NodoEstructura($1);}
        ;

    estructura
        : FUNCTOR PARIZQ {$<NodoEstructura>$=new NodoEstructura($1);} lista_fot PARDCH {$$=$<NodoEstructura>3;}

    lista_fot
        : fot {$<NodoEstructura>0.AnadirNodo($1);}
        | lista_fot COMA fot {$<NodoEstructura>0.AnadirNodo($3);}
        ;

    fot
        : VARIABLE {$$=NodoVariable.getInstance($1);}
        | termino
        ;
